package com.hot12345.common.spring;

import java.io.IOException;
import java.util.Iterator;
import java.util.Map;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;

import com.hot12345.common.util.XmlConfigUtilBase;
import com.hot12345.common.util.XmlProperties;

import freemarker.ext.beans.BeansWrapper;
import freemarker.template.Configuration;
import freemarker.template.TemplateException;
import freemarker.template.TemplateHashModel;

/**
 * 重写spring FreeMarkerConfigurer类，重写afterPropertiesSet方法，以便在spring创建
 * 完freemarker后增加一些动作处理，如将系统常用类TravelConstant作为freemarker全局对象。
 * 注：在spring配置文件中可以设置单个字符串全局变量，但不能以整个对象形式设置。
 * @author wuzongbao
 * 2011-10-13
 */
public class SpringFreeMarkerManagerInit extends FreeMarkerConfigurer {
	
	private final static Log logger = LogFactory.getLog(SpringFreeMarkerManagerInit.class);
	
	/**
	 * 覆盖初始化后的方法，将系统常用类TravelConstant加入到freemarker全局对象中。
	 * */
	@Override
	public void afterPropertiesSet() throws IOException, TemplateException {
		if(getConfiguration() == null) {
			setConfiguration(createConfiguration());
		}
		initGlobalObject(getConfiguration());
	}
	
	/**
     * 初始化freemarker全局静态对象
     * @param Configuration cfg
     * @author wuzongbao
     * @date 2011-10-13 下午01:09:47
     */
	private void initGlobalObject(Configuration cfg){
		if (cfg == null) {
			logger.error("初始化freemarker全局静态对象失败，Configuration==null");
			return;
		}
		
		//初始化 TravelConstant常量，将TravelConstant常量放到全局域中。
		XmlProperties xmlPro = XmlConfigUtilBase.getDefaultConfig();
		Map<String, Object> map = xmlPro.getProperties();
		if(map!=null && map.size()!=0){
			BeansWrapper wrapper = BeansWrapper.getDefaultInstance();
			TemplateHashModel staticModels = wrapper.getStaticModels();
			Map<String,Object> classMap = (Map<String,Object>)map.get("freemarInitClazzs");
			if(classMap!=null && classMap.size()!=0){
				Iterator iter = classMap.entrySet().iterator();
				try {
					while (iter.hasNext()) {
					    Map.Entry entry = (Map.Entry) iter.next();
					    Object key = entry.getKey();
					    Object val = entry.getValue();
					    cfg.setSharedVariable(key.toString(), (TemplateHashModel) staticModels
								.get(val.toString()));
					}
				}catch(Exception e){
					logger.error("初始化freemarker全局常量", e);
				}
			}

		}
	}
}
